package ve.usb.crm;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;

import ve.usb.cohesion.runtime.LocalDate;
import ve.usb.cohesion.runtime.Pair;
import java.util.List;

/**
 *
 */
public class AccionesTarea extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreTareas.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreTareas(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VTareas",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            List<Tarea> list = (List<Tarea>) s.createQuery("from Tarea where esActivo = true").list();

            for (Tarea l : list) {
                if (l.getCuentaRelacionada() != null) {
                    Hibernate.initialize(l.getCuentaRelacionada().getNombre());
                }
                if (l.getContactoRelacionado() != null) {
                    Hibernate.initialize(l.getContactoRelacionado().getNombre());
                }
                if (l.getPrioridad() != null) {
                    Hibernate.initialize(l.getPrioridad().getNombre());
                }
                if (l.getEstado() != null) {
                    Hibernate.initialize(l.getEstado().getNombre());
                }
            }

            request.setAttribute("L_Tarea", list);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreCrearTarea.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreCrearTarea(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearTarea",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        //Checking for actors administrador, empleado
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Trato de obtener el atributo idCuenta y obtengo el atributo usuario actual en la session
            FCrearTarea fFCrearTarea = FCrearTarea.clear(mapping, request);

            if (request.getAttribute("formulario") != null) {
                fFCrearTarea = (FCrearTarea) request.getAttribute("formulario");
            }

            Long idCuenta = lookup_Long(request, "idCuenta");
            Long idContacto = lookup_Long(request, "idContacto");
            Long idOportunidad = lookup_Long(request, "idOportunidad");

            Personal usuario = (Personal) request.getSession().getAttribute("Usuario");
            //Verifico si vengo de una cuenta para agregarlo al formulario
            if (idCuenta != null) {
                fFCrearTarea.setCuenta(idCuenta);
            }


            //Verifico si vengo de una cuenta para agregarlo al formulario
            if (idContacto != null) {
                fFCrearTarea.setContactos(idContacto);
            }


            //Verifico si vengo de una cuenta para agregarlo al formulario
            if (idOportunidad != null) {
                fFCrearTarea.setContactos(idContacto);
            }



            //Verifico si hay un usuario en la sesion para agregarlo al formulario
            if (usuario != null) {
                fFCrearTarea.setPersonal(usuario.getIdPersonal());
            }

            cargarCollection(fFCrearTarea, s);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ACrearTarea.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ACrearTarea(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearTarea", "APreTarea",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_1;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearTarea fFCrearTarea = (FCrearTarea) form;
            boolean hayError = false;


            if (fFCrearTarea.getPersonal() == 0l) {
                hayError = true;
                request.setAttribute("personalError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El personal no debe de ser nulo");
            }

            if (fFCrearTarea.getAsunto().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("asuntoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El Asunto no debe de ser nulo");
            }

            if (fFCrearTarea.getPrioridad() == 0l) {
                hayError = true;
                request.setAttribute("prioridadError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>La Prioridad no debe de ser nulo");
            }

            if (fFCrearTarea.getEstado() == 0l) {
                hayError = true;
                request.setAttribute("estadoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El valor del personal no debe de ser nulo");
            }

             if (fFCrearTarea.getFechaVencimiento().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("fechaVencimientoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>La fecha no debe ser nulo");
            }

            if (hayError) {
                cargarCollection(fFCrearTarea, s);
                salida = SALIDA_0;
            } else {
                Tarea tarea = new Tarea();
                if (fFCrearTarea.getIdTarea() != 0l) {
                    tarea = (Tarea) s.createQuery("from Tarea where idTarea = :idTarea").setLong("idTarea", fFCrearTarea.getIdTarea()).uniqueResult();
                }

                //tarea.setComentarios(fFCrearTarea.getComentarios());
                tarea.setCorreoElectronico(fFCrearTarea.getCorreoElectronico());
                DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                tarea.setFechaVencimiento(df.parse(fFCrearTarea.getFechaVencimiento()));
                tarea.setTelefono(fFCrearTarea.getTelefono());
                tarea.setDescripcion(fFCrearTarea.getDescripcion());


                if (fFCrearTarea.getPrioridad() != 0l) {
                    Categoria prioridad = (Categoria) s.load(Categoria.class, fFCrearTarea.getPrioridad());
                    tarea.setPrioridad(prioridad);
                }

                if (fFCrearTarea.getEstado() != 0l) {
                    Categoria estado = (Categoria) s.load(Categoria.class, fFCrearTarea.getEstado());
                    tarea.setEstado(estado);
                }


                if (fFCrearTarea.getAsunto().compareTo("") != 0) {
                    tarea.setAsunto(fFCrearTarea.getAsunto());
                }

                if (fFCrearTarea.getContactos() != 0l) {
                    Contacto contacto = (Contacto) s.load(Contacto.class, fFCrearTarea.getContactos());
                    tarea.setContactoRelacionado(contacto);
                }

                if (fFCrearTarea.getCuenta() != 0l) {
                    Cuenta cuenta = (Cuenta) s.load(Cuenta.class, fFCrearTarea.getCuenta());
                    tarea.setCuentaRelacionada(cuenta);
                }

                if (fFCrearTarea.getOportunidades() != 0l) {
                    Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, fFCrearTarea.getOportunidades());
                    tarea.setOportunidadRelacionada(oportunidad);
                }

                if (fFCrearTarea.getPersonal() != 0l) {
                    Personal personal = (Personal) s.load(Personal.class, fFCrearTarea.getPersonal());
                    tarea.setPersonal(personal);
                }

                tarea.setEsActivo(true);
                if (fFCrearTarea.getIdTarea() == 0) {
                    s.save(tarea);
                } else {
                    tarea.setIdTarea(fFCrearTarea.getIdTarea());
                    s.update(tarea);
                }
                s.flush();

                request.setAttribute("idTarea", tarea.getIdTarea());
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreTarea.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreTarea(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VTarea",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            HttpSession sess = request.getSession();
            Long idTarea = (Long) request.getAttribute("idTarea");
            if (idTarea == null) {
                idTarea = lookup_Long(request, "idTarea");
            }

            Tarea tarea = (Tarea) s.load(Tarea.class, idTarea);
            Contacto contactoRelacionado = new Contacto();
            if (tarea.getContactoRelacionado() != null) {
                contactoRelacionado = (Contacto) s.load(Contacto.class, tarea.getContactoRelacionado().getIdContacto());
            }
            Personal personal = (Personal) s.load(Personal.class, tarea.getPersonal().getIdPersonal());
            if (tarea.getOportunidadRelacionada() != null) {
                Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, tarea.getOportunidadRelacionada().getIdOportunidad());
                Hibernate.initialize(oportunidad);
            }

            if (tarea.getPrioridad() != null) {
                Categoria prioridad = (Categoria) s.load(Categoria.class, tarea.getPrioridad().getIdCategoria());
                Hibernate.initialize(prioridad);
            }

            if (tarea.getEstado() != null) {
                Categoria estado = (Categoria) s.load(Categoria.class, tarea.getEstado().getIdCategoria());
                Hibernate.initialize(estado);
            }

            Hibernate.initialize(personal);

            Hibernate.initialize(contactoRelacionado);
            Hibernate.initialize(tarea.getPrioridad());

            if (tarea.getCuentaRelacionada() != null) {
                Cuenta cuenta = (Cuenta) s.load(Cuenta.class, tarea.getCuentaRelacionada().getIdCuenta());
                Hibernate.initialize(cuenta);
                request.setAttribute("Cuenta", cuenta);
            }

            FCrearComentario fFCrearComentario = new FCrearComentario();

            Categoria cate = (Categoria) s.createQuery("from Categoria where nombre = :cat").setString("cat", "Tarea").uniqueResult();
            fFCrearComentario.setCategoria(cate.getIdCategoria());
            fFCrearComentario.setAsociadoA(idTarea);

            List<Comentario> comentarios = (List<Comentario>) s.createQuery("from Comentario where asociadoA = :idTarea and categoria = :idCategoria").setLong("idTarea", idTarea).setLong("idCategoria", cate.getIdCategoria()).list();

            for (Comentario c : comentarios) {
                c.getPersonal().getNombre();
            }

            sess.setAttribute("FCrearComentario", fFCrearComentario);
            request.setAttribute("L_Comentarios", comentarios);

            request.setAttribute("Contacto", contactoRelacionado);
            request.setAttribute("Tarea", tarea);
            request.setAttribute("Personal", personal);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEditarTarea.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEditarTarea(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearTarea",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            Long idTarea = (Long) lookup_Long(request, "idTarea");
            Tarea tarea = (Tarea) s.load(Tarea.class, idTarea);


            FCrearTarea fFCrearTarea = FCrearTarea.clear(mapping, request);

            if (request.getAttribute("formulario") != null) {
                fFCrearTarea = (FCrearTarea) request.getAttribute("formulario");
            }

//            Categoria categoria = (Categoria) s.createQuery("from Categoria where nombre = '" + tarea.getAsunto() + "'").uniqueResult();


            fFCrearTarea.setAsunto(tarea.getAsunto());
            //fFCrearTarea.setComentarios(tarea.getComentarios());
            fFCrearTarea.setCorreoElectronico(tarea.getCorreoElectronico());
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            fFCrearTarea.setFechaVencimiento(df.format(tarea.getFechaVencimiento()));
            fFCrearTarea.setPrioridad(tarea.getPrioridad().getIdCategoria());
            fFCrearTarea.setTelefono(tarea.getTelefono());
            fFCrearTarea.setIdTarea(idTarea);

            if (tarea.getContactoRelacionado() != null) {
                fFCrearTarea.setContactos(tarea.getContactoRelacionado().getIdContacto());
            }

            if (tarea.getCuentaRelacionada() != null) {
                fFCrearTarea.setCuenta(tarea.getCuentaRelacionada().getIdCuenta());

            }

            if (tarea.getOportunidadRelacionada() != null) {
                fFCrearTarea.setOportunidades(tarea.getOportunidadRelacionada().getIdOportunidad());
            }

            if (tarea.getEstado() != null) {
                fFCrearTarea.setEstado(tarea.getEstado().getIdCategoria());
            }


            fFCrearTarea.setPersonal(tarea.getPersonal().getIdPersonal());

            cargarCollection(fFCrearTarea, s);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AEliminarTarea.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward AEliminarTarea(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreTareas",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador
        if (!CohesionActor.checkActor(request, 1)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Consigo el id del contacto
            Long idTarea = lookup_Long(request, "idTarea");
            Tarea tarea = (Tarea) s.load(Tarea.class, idTarea);

            tarea.setEsActivo(false);
            s.update(tarea);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    private void cargarCollection(FCrearTarea fFCrearTarea, Session s) {

        Long asuntoCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'asunto' and tipo = :root").setLong("root", 0).uniqueResult();
        Long prioridadCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'prioridad' and tipo = :root").setLong("root", 0).uniqueResult();
        Long estadoCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'estado' and tipo = :root").setLong("root", 0).uniqueResult();


        List<Pair> list =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idPersonal) "
                + "from Personal").list();
        list.add(0, new Pair("Ninguno", 0));
        fFCrearTarea.setListaPersonal(list);

        List<Pair> listAsunto =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                + "from Categoria where tipo= :idCategoria").setLong("idCategoria", asuntoCategoria).list();
        listAsunto.add(0, new ve.usb.cohesion.runtime.Pair("Ninguno", 0));
        fFCrearTarea.setListAsunto(listAsunto);

        List<Pair> prioridadSection =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                + "from Categoria where tipo=:idCategoria").setLong("idCategoria", prioridadCategoria).list();
        prioridadSection.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
        fFCrearTarea.setListaPrioridad(prioridadSection);

        List<Pair> listContactos =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idContacto) "
                + "from Contacto where esActivo = :esActivo").setBoolean("esActivo", true).list();
        listContactos.add(0, new ve.usb.cohesion.runtime.Pair("Ninguno", 0));
        fFCrearTarea.setListaContactos(listContactos);

        List<Pair> listCuentas =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idCuenta) "
                + "from Cuenta where esActivo = :esActivo").setBoolean("esActivo", true).list();
        listCuentas.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
        fFCrearTarea.setListaCuentas(listCuentas);

        List<Pair> listOportunidades =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idOportunidad) "
                + "from Oportunidad where esActivo = :esActivo").setBoolean("esActivo", true).list();
        listOportunidades.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
        fFCrearTarea.setListaOportunidades(listOportunidades);

        List<Pair> listEstado =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                + "from Categoria where tipo= :idCategoria").setLong("idCategoria", estadoCategoria).list();
        listEstado.add(0, new Pair("Ninguno", 0));
        fFCrearTarea.setListaEstado(listEstado);

        List<Pair> listPersonal =
                (List<Pair>) s.createQuery(
                "select new ve.usb.cohesion.runtime.Pair(nombre, idPersonal) "
                + "from Personal where esActivo = :esActivo").setBoolean("esActivo", true).list();
        listPersonal.add(0, new Pair("Ninguno", 0));
        fFCrearTarea.setListaRelacionadosCon(listPersonal);

    }
}
